Hydra 是一個 OAuth 2.0 授權服務,同時也是 OpenID Connect 服務提供者。有些人會誤以為這兩個服務的職責,是要保存使用者資料,並讓使用者登入。事實上,它們的任務是把使用者的憑證,轉換成 Access Token 或 ID Token。這有點像在使用 cookie 儲存 session 資訊一樣,但它使用的方法更加有彈性,同時也適合用在第三方應用程式授權與身分驗證。
Hydra 的設計是不存放使用者相關資料,如帳號、密碼、或個人資料等,這些資料是放在其他身分驗證或資料庫服務裡。Hydra 只有存放身分驗證與授權的記錄,並使用 Login Flow 與 Consent Flow 的流程,來跟這些服務整合。這個流程會使用 HTTP 轉導機制將瀏覽器轉導至 Login Provider 與 Consent Provider。這兩個 provider 是可以完全客製化的,它們可以是既有服務也可以是重寫新的程式。
概觀而言,這兩個服務的職責如下:
剛學 OAuth 2.0 時,可能會把 Scope 與一般的存取控制,如 RBAC(Role Based Access Control)或 ACL(Access Control Lists)搞混。
系統內部所實作的存取控制,是在限制使用者能夠在系統上做什麼事。比方說系統管理員有所有的權限,而一般使用者只能存取個人資訊。
相對的,Scope 並不是在描述使用者能在系統做什麼事。Scope 在說的是使用者允許應用程式能夠代表使用者的身分存取到哪些資源。比方說,使用者可以授權應用程式讀取使用者的照片,但不允許應用程式代表使用者上傳照片。所以 OAuth 2.0 Scope 表達的並不是使用者權限,它表達的是應用程式可以代表使用者做哪些事。
Login 與 Consent 是 Hydra 兩個最重要的部分。下面將會介紹如何把現有的會員系統跟 Hydra 整合,這樣就能成為 OAuth 2.0 與 OpenID Connect 的服務提供者,就像 Google、Facebook 一樣。
前面已概述了 Hydra 的任務,這裡將會說明 Login Flow 與 Consent Flow 流程的細節。這個流程會執行一連串的轉導,包括 Login Provider 使用者身分驗證,再到 Consent Provider 授權。這兩個 Provider 都將由開發者自由實作。比方說使用 NodeJS 實作可以接 /login
與 /consent
的 HTTP Server,就能當作是 Login Provdier 與 Consent Provider 了。
先來看循序圖:
細節如下:
http://hydra/oauth2/auth
這個端點。http://login-provider/login?login_challenge=1234...
。http://hydra/oauth2/auth?client_id=...&...&login_verifier=4321
。http://consent-service/consent?consent_challenge=4567...
。http://hydra/oauth2/auth?client_id=...&...&consent_verifier=7654...
。第 1 步是應用程式發送身分驗證請求,啟動 Hydra 登入與授權流程,第 7 步則是建立身分驗證回應,回傳給應用程式。
中間 Hydra 作為控制流程的核心,它會決定瀏覽器要轉導至 Login Provider 或是 Consent Provide ,或是完成整個流程並導回應用程式。在這個設計下,開發者能夠對身分驗證和授權的行為,有更完整的控制,像身分驗證就能夠輕易的在第 3 步的 Login Provider 上實作多因子驗證。
明天將會來準備這些 Provider,並且跟 Hydra 登入和授權流程整合。